﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Gustozzi.BL;
using Gustozzi.DAL;
using System.Text;
namespace WebGustozzi.ModuloVentas
{
    ///<summary>
    ///Nombre	    : wfGenerarPedidoVenta
    ///Descripción	: 
    ///               
    ///</summary>
    ///<remarks>
    ///Fecha        Moficado Por        Descripción
    ///07/02/2012               	    Versión inicial
    ///19/02/2012   Marco Pizarro	    Agregar validaciones iniciales
    ///</remarks>
    public partial class wfGenerarPedidoVenta : System.Web.UI.Page
    {
        VentasDataEntities contexto = null;
        string codSucursal = string.Empty;
        Pedido oPedido = null;
        Cliente oCliente = null;
        List<PedidoItem> listaPedidos = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Inicializar();
                hdf_InicioGrilla.Value = "S";
                Session["numSelProd"] = "0";
            }
            else
            {
                hdf_InicioGrilla.Value = "N";
                ActivarFechaPago();
                CargarDetallePedido();
            }
        }

        protected void imbCancelar_Click(object sender, ImageClickEventArgs e)
        {
            Cancelar();
        }

        public void Inicializar()
        {
            txtFechaPago.Attributes.Add("onblur", String.Format("FechaValida('{0}','{1}','{2}')", txtFechaPago.ClientID, "Pedido de Venta", "Ingrese una Fecha de Pago válido"));
            txtFechaEntrega.Attributes.Add("onblur", String.Format("FechaValida('{0}','{1}','{2}')", txtFechaEntrega.ClientID, "Pedido de Venta", "Ingrese una Fecha de Entrega válido"));
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            codSucursal = "010";
            EditarControles(false);
            NuevoRegistro();
            this.txtNroPedido.Text = "";
            hdfIdPedido.Value = "";
        }

        public void EditarControles(Boolean estado)
        {
            this.btnAgregaCliente.Enabled = estado;
            this.txtDireccion.Enabled = estado;
            this.imbBuscarDireccion.Visible = estado;
            this.ddlVendedor.Enabled = estado;
            this.btnAgregaProducto.Enabled = estado;
            this.ddlFormaPago.Enabled = estado;
            this.txtFechaPago.Enabled = estado;
            this.txtFechaEntrega.Enabled = estado;
            this.txtObservaciones.Enabled = estado;
            this.imbFechaPago.Visible = estado;
            this.imbFechaEntrega.Visible = estado;
            this.imbBuscarPedido.Visible = !estado;
        }

        public void LimpiarCampos()
        {
            grvListaProductos.DataSourceID = null;
            grvListaProductos.DataSource = null;
            grvListaProductos.DataBind();

            this.txtDireccion.Text  = "";
            this.txtCodCliente.Text = "";
            this.txtNomCliente.Text = "";
            this.txtTipDoc.Text = "";
            this.txtNroDoc.Text = "";
            this.txtObservaciones.Text = "";

            divMensaje.Visible = false;
        }

        protected void btnAgregaProducto_Click(object sender, EventArgs e)
        {
            Response.Redirect("wfAgregarProducto.aspx");
        }

        protected void imbGuardar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                String valMensaje = ValidarDatos();
                if (valMensaje == null)
                {
                    GuardarPedido();
                }
                else
                {
                    lblMsj.Text = valMensaje;
                    lblMsj.ForeColor = System.Drawing.Color.Red;
                    divMensaje.Visible = true;
                }
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor  = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }


        public void Cancelar()
        {
            NuevoRegistro();
            EditarControles(false);
            LimpiarCampos();
            this.txtNroPedido.Text = "";
            hdfIdPedido.Value = "";
            divRegistrar.Visible = false;
            divControlesManten.Visible = true;
            divMensaje.Visible = false;
        }

        public String ValidarDatos()
        {
             string msjError = null;
             if (String.IsNullOrEmpty(txtCodCliente.Text))
             {
                 msjError = "Ingrese los datos del cliente.";
                 return msjError;
             }
             if (String.IsNullOrEmpty(txtDireccion.Text ))
             {
                 msjError = "Ingrese la dirección de entrega.";
                 return msjError;
             } if (grvListaProductos.Rows.Count <= 0)
             {
                 msjError = "Ingrese por lo menos un producto.";
                 return msjError;
             }
             return msjError;
        }

        protected void btnCerrar_Click(object sender, EventArgs e)
        {
            Response.Redirect("../wfPrincipal.aspx");
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            NuevoRegistro();
            EditarControles(true);
            LimpiarCampos();
            ActivarFechaPago();
            divRegistrar.Visible = true;
            divControlesManten.Visible = false;
        }

        public void NuevoRegistro()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }

            var resultado = from v in contexto.Vendedores.Include("Empleado")
                            select new { NombreVendedor = v.Empleado.apellidoPaterno + " " + v.Empleado.apellidoMaterno + ", " + v.Empleado.nombre, v.codigoVendedor };

            ddlVendedor.DataSource = resultado;
            ddlVendedor.DataValueField = "codigoVendedor";
            ddlVendedor.DataTextField = "NombreVendedor";
            ddlVendedor.DataBind();

            List<string> numeroPedido = contexto.ObtenerNumeroPedido(codSucursal).ToList();
            if (numeroPedido != null)
            {
                if (numeroPedido.Count > 0)
                {
                    txtNroPedido.Text = numeroPedido[0];
                }
            }

            var resultadoIGV = (from i in contexto.ListadoIGV
                                where i.estado == 1
                                select i.porcentaje).ToList();

            txtIGV.Text = "--NC--";
            if (resultadoIGV != null)
            {
                if (resultadoIGV.Count > 0)
                {
                    txtIGV.Text = resultadoIGV[0].Value.ToString();
                }
            }

            var resultadoTipoPago = (from p in contexto.TiposCondicionesPago
                                     select p);

            ddlFormaPago.DataSource = resultadoTipoPago;
            ddlFormaPago.DataValueField = "codigoCondicionPago";
            ddlFormaPago.DataTextField = "descripcion";
            ddlFormaPago.DataBind();


            List<string> listaEstados = new List<string>();
            listaEstados.Add(PedidoBL.cPedido_Pendiente);
            listaEstados.Add(PedidoBL.cPedido_Facturado);
            listaEstados.Add(PedidoBL.cPedido_Observado);
            listaEstados.Add(PedidoBL.cPedido_Anulado);

            ddlEstado.DataSource = listaEstados;
            ddlEstado.DataBind();

            txtFechaEmision.Text = DateTime.Now.ToShortDateString();
            txtFechaEntrega.Text = DateTime.Now.ToShortDateString();
            txtFechaPago.Text = DateTime.Now.ToShortDateString();
        }


        protected void btnAgregaCliente_Click1(object sender, EventArgs e)
        {
            Response.Redirect("wfConsultarCliente.aspx");
        }

        protected void txtCodCliente_TextChanged(object sender, EventArgs e)
        {
            ConsultarCliente();
        }

        public void ConsultarCliente()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            int idCliente = 0;
            if (!txtCodCliente.Text.Trim().Equals(string.Empty))
            {
                idCliente = Convert.ToInt32(txtCodCliente.Text.Trim());
            }
            var lstClienteBusq = (from c in contexto.Clientes
                                  where c.codigoCliente == idCliente
                                  select c);

            Cliente oCliente = null;
            if (lstClienteBusq.Count() > 0)
            {
                oCliente = (Cliente)lstClienteBusq.First();
            }

            if (oCliente != null)
            {
                txtNomCliente.Text = oCliente.apellidoPaternoCliente + ' ' + oCliente.apellidoMaternoCliente + ',' +
                    oCliente.nombreCliente;
                txtNroDoc.Text = oCliente.numeroDocumento;
                TipoDocumentoPersona tipoDoc = (from td in contexto.TiposDocumentosPersona
                                                where td.codigoTipoDocumentoPersona == oCliente.codigoTipoDocumentoPersona
                                                select td).First();

                txtTipDoc.Text = tipoDoc.nombre;
            }
        }

        protected void grvDireccion_SelectedIndexChanged(object sender, EventArgs e)
        {
            string s;
            s = e.ToString();
        }

        protected void hdfNumItems_ValueChanged(object sender, EventArgs e)
        {
            try
            {
                CargarDetallePedido();
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }

        protected void txtNroPedido_TextChanged(object sender, EventArgs e)
        {
            try
            {
                CargarDatosPedido();
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }

        public void CargarDetallePedido()
        {
            if (Session["listaProductos"] != null)
            {
                List<ItemPedido> listaProductos = (List<ItemPedido>)Session["listaProductos"];
                grvListaProductos.DataSource = null;
                grvListaProductos.DataSource = listaProductos;
                grvListaProductos.DataBind();
            }
        }
        public void BuscarPedido()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            var lstPedidos = (from p in contexto.Pedidos
                               where p.nroPedido == txtNroPedido.Text
                               select p);
            if (lstPedidos.Count() >0)
            {
                oPedido = lstPedidos.First();
                hdfIdPedido.Value = oPedido.codigoPedido.ToString();
                Cliente oCliente = (from c in contexto.Clientes
                                    where c.codigoCliente == oPedido.codigoCliente
                                    select c).First();

                listaPedidos = (List<PedidoItem>)(from p in contexto.PedidoItems.Include("Producto")
                                                  where p.codigoPedido == oPedido.codigoPedido
                                                  select p).ToList();
            }
        }

        public void CargarDatosPedido()
        {
            BuscarPedido();
            Limpiar(false);
            if (oPedido != null)
            {
                ddlVendedor.SelectedValue = oPedido.codigoVendedor.ToString();
                txtFechaEmision.Text = oPedido.fechaColocacion.Value.ToShortDateString();
                txtCodCliente.Text = oPedido.codigoCliente.ToString();
                ddlFormaPago.SelectedValue = oPedido.codigoCondicionPago.ToString();
                txtFechaPago.Text = oPedido.fechaPago.Value.ToShortDateString();
                txtFechaEntrega.Text = oPedido.fechaPactadaEntrega.Value.ToShortDateString();
                ddlEstado.SelectedValue = oPedido.estado;
                txtObservaciones.Text = oPedido.observaciones;
                txtDireccion.Text = oPedido.datosDespacho;

                ConsultarCliente();

                Session["listaProductos"] = null;
                grvListaProductos.DataSource = null;

                if (listaPedidos != null)
                {
                    List<ItemPedido> listaProductos = new List<ItemPedido>();
                    foreach (var item in listaPedidos)
                    {
                        ItemPedido oItemPedido = new ItemPedido();
                        oItemPedido.cantidad = (double)item.cantidad;
                        oItemPedido.codigoPedido = item.codigoPedido;
                        oItemPedido.codigoPedidoDetalle = item.codigoPedidoDetalle;
                        oItemPedido.codigoProducto = (int)item.codigoProducto;
                        if (item.codigoPromocion != null)
                        {
                            oItemPedido.codigoPromocion = (int)item.codigoPromocion;
                        }
                        oItemPedido.importe = (double)item.importe;
                        oItemPedido.nombreProducto = item.Producto.descripcion;
                        oItemPedido.precioUnitario = (double)item.precioUnitario;
                        var uMedida = (from u in contexto.UnidadesMedida
                                       where u.codigoUnidMedida == item.Producto.codigoUnidMedida
                                       select u).First();
                        oItemPedido.unidadMedida = uMedida.descripcion;
                        listaProductos.Add(oItemPedido);
                    }
                    Session["listaProductos"] = listaProductos;
                    hdfNumItems.Value = "-1";

                    CargarDetallePedido();
                }
            }
            else 
            {
                throw new Exception("No se ha encontrado el pedido ingresado.");
            }
        }

        public void GuardarPedido()
        {
           Pedido  oPedidoNuevo = null;
           if (contexto == null)
           {
               contexto = new VentasDataEntities();
           }
           int idPedido = 0;
            if (!hdfIdPedido.Value.Trim().Equals(string.Empty))
            {              
                

                idPedido=Convert.ToInt32(hdfIdPedido.Value);
            }
                var listaPedidos = (from p in contexto.Pedidos
                                        where p.codigoPedido == idPedido
                                        select p);

                if (listaPedidos.Count() > 0)
                {
                    oPedidoNuevo = listaPedidos.First();
                }
                else 
                {
                    oPedidoNuevo = new Pedido();
                    oPedidoNuevo.codigoPedido = idPedido;
                    contexto.AddToPedidos(oPedidoNuevo);
                }              
            

            int idCliente = Convert.ToInt32(txtCodCliente.Text.Trim());
            string idVendedor = ddlVendedor.SelectedValue;

            oPedidoNuevo.codigoCliente = idCliente;
            oPedidoNuevo.codigoVendedor = Convert.ToInt32(idVendedor);
            oPedidoNuevo.fechaColocacion = Convert.ToDateTime(txtFechaEmision.Text);
            oPedidoNuevo.fechaPago = Convert.ToDateTime(txtFechaPago.Text);
            oPedidoNuevo.observaciones = txtObservaciones.Text;
            oPedidoNuevo.codigoCondicionPago = Convert.ToInt32(ddlFormaPago.SelectedValue);


            oPedidoNuevo.datosDespacho = txtDireccion.Text;

            oPedidoNuevo.nroPedido = txtNroPedido.Text;
            oPedidoNuevo.estado = PedidoBL.cPedido_Pendiente;
            oPedidoNuevo.fechaPactadaEntrega = Convert.ToDateTime(txtFechaEntrega.Text);

            List<ItemPedido> lstItemsPedido = (List<ItemPedido>)Session["listaProductos"];

            if (lstItemsPedido != null)
            {
                PedidoBL oPedidoBL = new PedidoBL();
                int rpt = oPedidoBL.ActualizaPedido(oPedidoNuevo, lstItemsPedido, contexto);
                if (rpt > 0)
                {
                    lblMsj.Text = "Se guardó satisfactoriamente el documento.";
                    lblMsj.ForeColor = System.Drawing.Color.Blue;
                    EditarControles(false);
                    divControlesManten.Visible = true;
                    divRegistrar.Visible = false;
                    divMensaje.Visible = true;
                }
                else 
                {
                    lblMsj.Text = "Se produjo un error al intentar guardar, cierre y vuelva a intentarlo.";
                    lblMsj.ForeColor = System.Drawing.Color.Red;
                    divMensaje.Visible = true;
                }
            }
        }

        public void Limpiar(bool nuevo) 
        {
            txtCodCliente.Text = string.Empty;
            ddlVendedor.SelectedIndex = 0;
            txtFechaEmision.Text = string.Empty;
            txtFechaPago.Text = string.Empty;
            txtObservaciones.Text = string.Empty;
            ddlFormaPago.SelectedIndex = 0;
            txtDireccion.Text = string.Empty;
           
            ddlEstado.SelectedValue= PedidoBL.cPedido_Pendiente;
            txtFechaEntrega.Text = string.Empty;
            Session["listaProductos"] = null;
            grvListaProductos.DataSource = null;
            grvListaProductos.DataBind();
            hdfNumItems.Value = "0";
            txtNomCliente.Text = string.Empty;
            txtNroDoc.Text = string.Empty;
            txtTipDoc.Text = string.Empty;

            divMensaje.Visible = false;
            if (nuevo)
            {
                NuevoRegistro();
                txtNroPedido.Text = string.Empty;
                hdfIdPedido.Value = string.Empty;
            }

        }
        protected void grvListaProductos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (hdf_InicioGrilla.Value == "N")
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    e.Row.Attributes["OnClick"] = Page.ClientScript.GetPostBackClientHyperlink(this.grvListaProductos, "Select$" + e.Row.RowIndex.ToString());
                }
            }
        }

        protected void grvListaProductos_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                if (e.RowIndex >= 0)
                {
                    List<ItemPedido> lstItemsPedido = (List<ItemPedido>)Session["listaProductos"];
                    lstItemsPedido.RemoveAt(e.RowIndex);
                    Session["listaProductos"] = lstItemsPedido;
                    CargarDetallePedido();
                }
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }

        protected void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(this.txtNroPedido.Text))
                {
                    lblMsj.Text = "Seleccione el documento a modificar.";
                    lblMsj.ForeColor = System.Drawing.Color.Red;
                    divMensaje.Visible = true;
                } else
                {                
                    if (ddlEstado.SelectedValue == PedidoBL.cPedido_Pendiente ||
                        ddlEstado.SelectedValue == PedidoBL.cPedido_Observado)
                    {
                        //habilitar campos de edicion
                        EditarControles(true);
                        ActivarFechaPago();
                        divRegistrar.Visible = true;
                        divControlesManten.Visible = false;
                        divMensaje.Visible = false;
                    }
                    else
                    {
                        lblMsj.Text = "Solo se puede modificar un pedido en estado [Pendiente] u [Observado].";
                        lblMsj.ForeColor = System.Drawing.Color.Red;
                        divMensaje.Visible = true;
                    }
                }
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }

        protected void btnAnular_Click(object sender, EventArgs e)
        {
            try
            {

                if (ddlEstado.SelectedValue == PedidoBL.cPedido_Anulado)
                {
                    lblMsj.Text = "El documento ya se encuentra anulado.";
                    lblMsj.ForeColor = System.Drawing.Color.Red;
                    divMensaje.Visible = true;
                }
                else
                {
                    AnularPedido();
                }
            }
            catch (Exception exc)
            {
                lblMsj.Text = exc.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }
        public void AnularPedido()
        {
            PedidoBL oPedidoBL = new PedidoBL();
            int idPedido = int.Parse(hdfIdPedido.Value.Trim());
            if (!hdfIdPedido.Value.Trim().Equals(String.Empty))
            {
               
               bool  anulado= oPedidoBL.anulaPedido(idPedido);

               if (anulado)
               {
                   //mostrar mensaje ok
               }
               else 
               {
                   //mostrar mensaje error
               }
            }
            else
            {
                lblMsj.Text = "Seleccione el documento a anular.";
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }

        protected void grvListaProductos_SelectedIndexChanged(object sender, EventArgs e)
        {
            ActivarFechaPago();
            ddlFormaPago.DataBind();
        }

        public void ActivarFechaPago()
        {
            // Si es al contado la fecha de pago es la fecha de emisión, caso contrario puede ser editado por el usuario.
            if (this.ddlFormaPago.SelectedIndex == 0)
            {
                this.txtFechaPago.Text = this.txtFechaEmision.Text;
                this.txtFechaPago.Enabled = false;
                this.imbFechaPago.Visible = false;
            }
            else
            {
                this.txtFechaPago.Enabled = true;
                this.imbFechaPago.Visible = true;
            }
        }

        protected void ddlFormaPago_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (contexto == null)
                {
                    contexto = new VentasDataEntities();
                }
                int codigoPago = Convert.ToInt32(ddlFormaPago.SelectedValue);
                var condicionPago = from p in contexto.TiposCondicionesPago
                                    where p.codigoCondicionPago==codigoPago 
                                    select p.dias;
                if (condicionPago.Count() > 0)
                {
                    int numeroDias = (int)condicionPago.First();
                    DateTime FechaPago = Convert.ToDateTime(txtFechaEmision.Text);
                    FechaPago = FechaPago.AddDays(numeroDias);
                    txtFechaPago.Text = FechaPago.ToShortDateString();
                }

            }
            catch (Exception)
            {

                throw;
            }
        }


    }

}
